package z_mxsTest.testScrollableComposite;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * 测试将普通Composite转换为带滚动条的容器
 * 
 * 演示如何在不修改原始容器类型的情况下，
 * 通过在内部创建ScrolledComposite实现滚动功能
 */
public class testMakeCommCompositeScrolled {

    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("普通Composite滚动条测试");
        shell.setSize(500, 400);
        shell.setLayout(new FillLayout());

        // 创建一个普通Composite（没有滚动条）
        Composite parentComposite = new Composite(shell, SWT.NONE);
        parentComposite.setLayout(new FillLayout());

        // 测试方法1：直接在普通容器上添加控件（无滚动条）
        createNormalControls(parentComposite);

        // 测试方法2：使用工具类将普通容器转换为带滚动条的容器
        createScrollableControls(parentComposite);

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }

    /**
     * 在普通容器上创建控件（无滚动条）
     */
    private static void createNormalControls(Composite parent) {
        Composite group = new Composite(parent, SWT.BORDER);
        group.setLayout(new GridLayout(1, false));
        
        Button normalBtn = new Button(group, SWT.PUSH);
        normalBtn.setText("普通容器中的按钮");
        normalBtn.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        
        // 这个按钮会被添加到原始容器中，但不会有滚动条
        Button btn = new Button(parent, SWT.PUSH);
        btn.setText("点击切换到滚动模式");
        btn.addListener(SWT.Selection, e -> {
            // 清空容器并添加滚动内容
            for (Control child : parent.getChildren()) {
                child.dispose();
            }
            createScrollableControls(parent);
            parent.layout(true);
        });
    }

    /**
     * 将普通容器转换为带滚动条的容器
     */
    private static void createScrollableControls(Composite parent) {
        // 创建带滚动条的容器
        ScrolledComposite scrolledComposite = new ScrolledComposite(
            parent, 
            SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER
        );
        scrolledComposite.setLayout(new FillLayout());
        scrolledComposite.setBounds(parent.getClientArea());
        
        // 创建内容容器
        Composite contentComposite = new Composite(scrolledComposite, SWT.NONE);
        contentComposite.setLayout(new GridLayout(1, false));
        
        // 设置滚动内容
        scrolledComposite.setContent(contentComposite);
        scrolledComposite.setExpandHorizontal(true);
        scrolledComposite.setExpandVertical(true);
        
        // 添加大量控件到内容容器
        for (int i = 0; i < 30; i++) {
            Button btn = new Button(contentComposite, SWT.PUSH);
            btn.setText("滚动容器中的按钮 " + (i + 1));
            btn.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        }
        
        // 计算并设置最小尺寸以触发滚动条
        contentComposite.pack();
        scrolledComposite.setMinSize(contentComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        
        // 监听父容器大小变化，调整滚动容器
        parent.addListener(SWT.Resize, e -> {
            scrolledComposite.setBounds(parent.getClientArea());
            scrolledComposite.setMinSize(contentComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        });
    }
}